//
//  UIImage+TaoJExtension.m
//  百思不得姐2
//
//  Created by 陶建 on 15/8/8.
//  Copyright (c) 2015年 taoJ. All rights reserved.
//

#import "UIImage+TExtension.h"

@implementation UIImage (TExtension)

#pragma mark - 图片裁剪圆脑袋
/**************************** 图片裁剪圆脑袋 ***********************************/
/**
 *  根据传过来的图片名，把图片裁剪成圆形头像
 *
 *  @param imageName    图片名
 *  @param borderWidth  边框半径
 *  @param borderColor  边框颜色
 *
 *  @return 圆形图片
 */
+ (instancetype)conversionCircleImageWithImageName:(NSString *)imageName  borderWidth:(NSInteger)borderWidth borderColor:(UIColor *)borderColor
{
    UIImage *image = [UIImage imageNamed:imageName];
    return [image conversionCircleImageContextWithBorderWidth:borderWidth borderColor:borderColor];
}

/**
 *  图片裁剪成圆形头像(用上下文方式)
 *
 *  @param borderWidth 边框半径
 *  @param borderColor 边框颜色
 *
 *  @return 圆形图片
 */
- (instancetype)conversionCircleImageContextWithBorderWidth:(NSInteger)borderWidth borderColor:(UIColor *)borderColor
{
    /// 1.开启一个位图上下文
    // 图层山下文大小
    CGSize contextSize = self.size;
    // 开启位图上下文
    UIGraphicsBeginImageContextWithOptions(contextSize, NO, 0.0);
    
    /// 2.获取当前上下文
    // 获取上下文
    CGContextRef contxtRef = UIGraphicsGetCurrentContext();
    
    /// 3.画一个大圆，描述边框
    // 外层圆的半径，中心点的想、y
    CGFloat radius = contextSize.width * 0.5;
    CGFloat centerX = contextSize.width * 0.5;
    CGFloat centerY = contextSize.height * 0.5;
    // 在上下文添加一个大圆
    CGContextAddArc(contxtRef, centerX, centerY, radius, 0, 2 * M_PI, 0);
    // 背景颜色填充整个圆
    [borderColor setFill];
    
    // 描绘描述的圆
    CGContextFillPath(contxtRef);
    
    /// 4.画一个小圆，为了显示图片
    // 小圆的半径
    CGFloat innerRadius = radius - borderWidth;
    // 在上下文添加一个小圆
    CGContextAddArc(contxtRef, centerX, centerY, innerRadius, 0, 2 * M_PI, 0);
    
    // 裁剪后面的图片
    CGContextClip(contxtRef);
    
    // 图片画上去的位置、大小
    CGFloat drawInRectXY = borderWidth * 0.5;
    CGRect imageRect = CGRectMake(drawInRectXY, drawInRectXY, contextSize.width - borderWidth, contextSize.height - borderWidth);
    [self drawInRect:imageRect];
    
    /// 5.获取上下文中图片
    UIImage *circleImage = UIGraphicsGetImageFromCurrentImageContext();
    
    /// 6. 关闭上下文
    UIGraphicsEndImageContext();
    
    return circleImage;
}

/**
 *  图片裁剪成圆形头像(用Bezier方式)
 *
 *  @param borderWidth 边框半径
 *  @param borderColor 边框颜色
 *
 *  @return 圆形图片
 */
- (instancetype)conversionCircleImageBezierWithBorderWidth:(NSInteger)borderWidth borderColor:(UIColor *)borderColor
{
    /// 1.开启一个位图上下文
    // 图层山下文大小
    CGSize contextSize = self.size;
    UIGraphicsBeginImageContextWithOptions(contextSize, NO, 0.0);
    
    /// 2.画一个大圆，描述边框
    // 外层圆的半径，中心点的想、y
    CGFloat radius = contextSize.width * 0.5;
    CGFloat centerWidth = contextSize.width * 0.5;
    CGFloat centerHeight = contextSize.height * 0.5;
    CGPoint pointCenter = CGPointMake(centerWidth, centerHeight);
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:pointCenter radius:radius startAngle:0 endAngle:2 * M_PI clockwise:YES];
    [borderColor setFill];
    [path fill];
    
    /// 3.画一个小圆，为了显示图片
    // 小圆的半径
    CGFloat innerRadius = radius - borderWidth;
    path = [UIBezierPath bezierPathWithArcCenter:pointCenter radius:innerRadius startAngle:0 endAngle:2 * M_PI clockwise:YES];
    
    // 裁剪后面的图片
    [path addClip];
    
    CGFloat drawInRectXY = borderWidth * 0.5;
    CGRect imageRect = CGRectMake(drawInRectXY, drawInRectXY, contextSize.width - borderWidth, contextSize.height - borderWidth);
    [self drawInRect:imageRect];
    
    /// 4.获取上下文中图片
    UIImage *circleImage = UIGraphicsGetImageFromCurrentImageContext();
    
    /// 5. 关闭上下文
    UIGraphicsEndImageContext();
    
    return circleImage;
}

/****************************拉伸图片***********************************/
#pragma mark - 以图片中心位置1像素拉伸图片
/**
 *  拉伸图片
 *
 *  @param imageName 要拉伸的图片名
 *
 *  @return 拉伸过后的图片
 */
+ (instancetype)imageStretchWithImageName:(NSString *)imageName
{
    UIImage *image = [UIImage imageNamed:imageName];
    return [image stretchImageWithLocationCenterPoint];
}

#pragma mark 以图片中心位置1像素拉伸图片
/**
 *  拉伸图片
 *
 *  @return 拉伸过后的图片
 */
- (instancetype)stretchImageWithLocationCenterPoint
{
    CGFloat w = self.size.width * 0.5;
    CGFloat h = self.size.height * 0.5;
    return [self stretchableImageWithLeftCapWidth:w topCapHeight:h];
}

/****************************图片截取、裁剪***********************************/
#pragma mark - 从大图上截取指定位置图片
/**
 *  从大图上截取指定位置图片
 *
 *  @param bigImage 原始图片
 *  @param rect     截取的大小位置
 *
 *  @return 返回一个从原图上截取的新图片
 */
+ (instancetype)imageTailorWithBigImage:(UIImage *)bigImage rect:(CGRect)rect
{
    // 截取指定尺寸的图片
    CGImageRef ref = CGImageCreateWithImageInRect(bigImage.CGImage, rect);
    // 返回截取过的图片
    return [UIImage imageWithCGImage:ref];
}

#pragma mark 平均分割大图片成num个
/**
 *  按图片大小平均截取
 *
 *  @param bigImage  截取的原始图片
 *  @param num 截取的个数
 *
 *  @return 返回一个装在全部小图片的数组
 */
+ (NSArray *)imageTailorWithBigImage:(UIImage *)bigImage tailorNum:(NSInteger)num
{
    // 获取屏幕的像素与点的比例
    CGFloat screenScale = [UIScreen mainScreen].scale;
    // 获取每个小图片的宽度
    CGFloat smallImageW = bigImage.size.width / num * screenScale;
    // 获取图片的高度
    CGFloat smallImageH = bigImage.size.height * screenScale;
    
    // 用来存储每个小图片
    NSMutableArray *smallImageArray = [NSMutableArray array];
    // 循环截取图片
    for (int i =0; i < num; i++)
    {
        // 每个图片的矩形大小
        CGRect smallRect = CGRectMake((i * smallImageW), 0, smallImageW, smallImageH);
        
        // 截取图片添加到数组中
        [smallImageArray addObject:[self imageTailorWithBigImage:bigImage rect:smallRect]];
    }
    
    // 返回全部的小图片
    return smallImageArray;
}

/************************ 图片保存 ***************************************/
#pragma mark - 将控件保存成图片
/**
 *  把控件上的内容保存成一个图片
 *
 *  @param view 保存的控件
 *
 *  @return 图片
 */
+ (instancetype)imageWithSaveView:(UIView *)view
{
    // 1.开启一个位图上下文
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0);
    // 2.获取上下文
    // 3.将控制器view的layer渲染到上下文
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    // 4.获取图片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    // 5.关闭位图上下文
    UIGraphicsEndImageContext();
    
    // 6.返回图片
    return image;
}

#pragma mark - 图片水印
/**
 *  为图片添加文本水印
 *
 *  @param name  图片名
 *  @param irect 图片位置大小
 *  @param text  文本
 *  @param trect 文本位置大小
 *  @param dict  文本样式
 *
 *  @return 水印图片
 */
+ (instancetype)imageWaterWithImageName:(NSString *)name imageRect:(CGRect)irect text:(NSString *)text textRect:(CGRect)trect textAttribute:(NSDictionary *)dict
{
    UIImage *image = [UIImage imageNamed:name];
    
    // 开启一个位图上下文
    /// size: 开启的位图上下文大小
    /// opaque:是否不透明
    /// scale:缩放多少,一般不缩放＝0
    UIGraphicsBeginImageContextWithOptions(irect.size, NO, 0);
    // 把图片画到上下文中
    [image drawInRect:irect];
    
    // 把文字画到上下文中
    [text drawAtPoint:trect.origin withAttributes:dict];
    
    // 获取图片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    // 关闭当前上下文
    UIGraphicsEndImageContext();
    
    return newImage;
}

@end
